package org.pb.basic.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jdk.nashorn.internal.runtime.RewriteException;
import org.apache.ibatis.annotations.Delete;
import org.pb.basic.utils.AjaxResult;
import org.pb.basic.utils.FastDfsUtil;
import org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * FastDfs相关的功能接口
 * @author 10844
 */
@RestController
@RequestMapping("/fastdfs")
@Api(tags = "上传文件的服务接口", description = "上传文件处理相关的接口信息")
public class FastDfsController {

    /**
     * 上传文件对应的方法，将获取到的文件上传到FastDfs搭建的服务器上
     * @param file 通过注解@RequestPart获取到的上传文件，文件类型为MultipartFile
     * @return 返回处理结果信息和数据
     */
    @PostMapping
    @ApiOperation(value = "上传文件", notes = "将上传的logo图片，保存到FastDfs服务器上")
    public AjaxResult upload(@RequestPart(value = "file", required = true) MultipartFile file) {
        try {
            System.err.println("上传文件执行了");
            // 通过file获取到文件的原始名字
            String filename = file.getOriginalFilename();
            System.err.println(filename);
            // 通过字符串截取，获取到文件扩展名。【第一个/后的资源路径】
            filename = filename.substring(filename.indexOf("/") + 1);
            System.err.println(filename);
            // 通过FastDfs工具类，将文件上传到服务器中,并获取到完整的路径
            String path = FastDfsUtil.upload(file.getBytes(), filename);
            System.err.println(path);
            // 如果中途没有发生异常，表示上传成功，返回文件完整路径名
            return AjaxResult.successWithData(path);
        } catch (Exception e) {
            e.printStackTrace();
            // 如果发生异常表示上传失败
            return AjaxResult.failedWithMessage("上传失败，" + e.getMessage());
        }
    }

    /**
     * 根据路径删除上传文件内容
     * @param path 要删除的文件的内容
     * @return 返回命令执行结果
     */
    @DeleteMapping
    @ApiOperation(value = "删除文件", notes = "删除对应路径的logo文件")
    public AjaxResult remove(@RequestParam(value = "path") String path) {
        try {
            System.err.println("删除文件执行了");
            // 通过截取字符串，将路径中的第一个/截取掉 得到组名开头的路径字符串
            path = path.substring(1);

            // 通过字符串截取，获取到组名【截取第一个/前的字符串】
            String groupName = path.substring(0, path.indexOf("/"));
            System.err.println(groupName);

            // 通过字符串截取，获取到组名之后的资源路径
            String remoteName = path.substring(path.indexOf("/") + 1);
            System.err.println(remoteName);

            // 通过组名和扩展名，删除对应的文件内容
            FastDfsUtil.delete(groupName, remoteName);

            // 如果没有发生异常，表示删除成功，返回信息
            return AjaxResult.successWithMessage("删除成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果发生异常，表示删除失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }
    }

    /**
     * 批量删除文件
     * @param paths 要删除的多个文件的路径
     * @return 返回删除结果
     */
    @PatchMapping
    public AjaxResult batchRemove(@RequestBody List<String> paths) {
        try{
            // 遍历删除对应的路径
            for (String path: paths) {
                // 通过截取字符串，将路径中的第一个/截取掉 得到组名开头的路径字符串
                path = path.substring(1);

                // 通过字符串截取，获取到组名【截取第一个/前的字符串】
                String groupName = path.substring(0, path.indexOf("/"));
                System.err.println(groupName);

                // 通过字符串截取，获取到组名之后的资源路径
                String remoteName = path.substring(path.indexOf("/") + 1);
                System.err.println(remoteName);

                // 通过组名和扩展名，删除对应的文件内容
                FastDfsUtil.delete(groupName, remoteName);
            }
            // 如果没有发生异常，则表示删除成功
            return AjaxResult.successWithMessage("批量操作成功");
        } catch (Exception e) {
            e.printStackTrace();
            // 如果发生了异常，则表示批量删除失败
            return AjaxResult.failedWithMessage(e.getMessage());
        }

    }

}
